/**
*  \file middle.h
*
*  \brief Middel of three values
*
*  \author  Jocelyn Francois <yves-jocelyn.francois@linde-mh.de>
*  \author  Michael J. Hohmann <michael.hohmann@linde-mh.de>
*
*  Return the middle value of three passed parameter.
*         if two values are equal the lower value will be returned
*
*
*/

#ifndef MIDDLE_H_INCLUDED
#define MIDDLE_H_INCLUDED

/*================================================[ public includes  ]================================================*/
#include "../cfg/prj.h"

/*================================================[ public defines   ]================================================*/

#define MIDDLE_GENERIC(a,b,c)                   \
   if( a<=b )                                   \
   {                                            \
      if( b<=c )                                \
      {                                         \
         return b; /*  a  b  c   */             \
      }                                         \
      else                                      \
      {                                         \
         if ( a<=c )                            \
         {                                      \
            return c; /* a  c  b  */            \
         }                                      \
         else                                   \
         {                                      \
            return a; /*  c  a  b  */           \
         }                                      \
      }                                         \
   }                                            \
   else                                         \
   {                                            \
      if( a<=c )                                \
      {                                         \
         return a;        /*  b a c */          \
      }                                         \
      else                                      \
      {                                         \
         if ( b<=c )                            \
         {                                      \
            return c;        /* b  c  a */      \
         }                                      \
         else                                   \
         {                                      \
            return b;                           \
         }      /*   c  b  a  */                \
      }                                         \
   }

/*================================================[ public datatypes ]================================================*/

/*================================================[ public variables ]================================================*/

/*================================================[ public functions ]================================================*/

STATIC_INLINE U8  middle_u8  (U8  a, U8  b, U8 c ) { MIDDLE_GENERIC(a,b,c); }
STATIC_INLINE S8  middle_s8  (S8  a, S8  b, S8 c ) { MIDDLE_GENERIC(a,b,c); }
STATIC_INLINE U16 middle_u16 (U16 a, U16 b, U16 c) { MIDDLE_GENERIC(a,b,c); }
STATIC_INLINE S16 middle_s16 (S16 a, S16 b, S16 c) { MIDDLE_GENERIC(a,b,c); }
STATIC_INLINE U32 middle_u32 (U32 a, U32 b, U32 c) { MIDDLE_GENERIC(a,b,c); }
STATIC_INLINE S32 middle_s32 (S32 a, S32 b, S32 c) { MIDDLE_GENERIC(a,b,c); }
STATIC_INLINE F32 middle_f32 (F32 a, F32 b, F32 c) { MIDDLE_GENERIC(a,b,c); }

/*====================================================================================================================*/

#endif

/***********************************************************************************************************************
*                             Copyright 2009,2011 Linde Material Handling. All rights reserved.                        *
***********************************************************************************************************************/
